home *** CD-ROM | disk | FTP | other *** search
/ MacFormat 2003 June / macformat-130.iso / mac / Reviewed⁄Demos / Spearhead Demo / demota / pak1.pk3 / global / halftrack.scr < prev    next >
Encoding:
Text File  |  2002-10-21  |  13.4 KB  |  504 lines

  1.  
  2.  
  3.  
  4. //****************************************************
  5. //****************************************************
  6. halftrackinit local.halftrack local.health local.destroyedmodel:
  7.     local.halftrack waitthread initializer local.health local.destroyedmodel
  8. end
  9.  
  10. //****************************************************
  11. //****************************************************
  12. initializer local.health local.destroyedmodel:
  13.     //println "*********BINDING MG42 TO HALFTRACK********"
  14.     //self.mg42 = self QueryTurretSlotEntity 0 //mg42 setup
  15.     self.mg42 = spawn models/statweapons/mg42_gun.tik "angles" self.angles
  16.     if (self.mg42 == NIL)
  17.     {
  18.         exec global/error.scr ("Error could not create MG42 for halftrack at " + self.origin) 1
  19.     }
  20.     self AttachTurretSlot 0 self.mg42
  21.     self.mg42 setusable 1
  22.     self.mg42 maxyawoffset 40
  23.     self.mg42 pitchcaps ( -25 25 0)
  24.     self.mg42 bulletdamage 5 //20
  25.     self.mg42 bulletspread 40 40 //1 1
  26.     self.mg42 firedelay .1
  27.     self.mg42 setaimtarget NULL
  28.     self rendereffects "-shadow"
  29.     //self immune bullet
  30.     //self immune fast_bullet
  31.     //self immune grenade
  32.     self immune bash
  33.     self solid
  34.     if (local.health != NIL)
  35.     {
  36.         self.health = local.health
  37.     }
  38.     else
  39.     {
  40.         self.health = 100
  41.     }
  42.     
  43.     self takedamage
  44.     self removeondeath 0
  45.     if (self.target)
  46.         self.collisionent = self.target
  47.  
  48.     self thread halftrackmg42bind
  49.     self.mg42binderthread = parm.previousthread
  50.     self attachmodel "vehicles/sdkfz_shield.tik" "shield" 1.5 "halftrack1_gunnershield"
  51.     
  52.     self.center = spawn script_origin "targetname" "halftrack_center"
  53.     local.temp_origin = (self.forwardvector * 400) + self.origin
  54.     local.temp_origin[2] = local.temp_origin[2] + 160
  55.     self.center.origin = local.temp_origin
  56.     self.center.angles = self.angles
  57.     self.center bind self
  58.  
  59.     self.passengers = 0
  60.  
  61.     self.destroyedmodel = local.destroyedmodel
  62.     
  63.     if ($(self.gunner))
  64.     {
  65.         //println "*****ATTACHING GUNNER****"
  66.         self AttachPassengerSlot 1 self.gunner //gunner positioning
  67.         
  68.         self.gunner exec global/disable_ai.scr
  69.         
  70.         self.gunner.default_idle = self.gunner.type_idle
  71.         self.gunner.default_attack = self.gunner.type_attack
  72.         self.gunner.default_disguise = self.gunner.type_disguise
  73.         self.gunner.default_grenade = self.gunner.type_grenade
  74.  
  75.         self.gunner type_idle machinegunner
  76.         self.gunner type_attack machinegunner
  77.         self.gunner type_disguise machinegunner
  78.         self.gunner type_grenade machinegunner
  79.         
  80.         self.gunner turret self.mg42
  81.         self.gunner leash 0
  82.         self.gunner fixedleash 1
  83.         self.gunner physics_off
  84.         self.gunner rendereffects "-shadow"
  85.         self.gunner dontdropweapons
  86.         
  87.         //self.gunner exec global/setdeathanim.scr "death_collapse"
  88.         //self.gunner health 1000
  89.         
  90.         self.gunner exec global/setdeathanim.scr "death_fall_back"
  91.         
  92.         self thread halftrackgunnerlogic
  93.         self.gunnerlogicthread = parm.previousthread
  94.         self.gunner takedamage
  95.         self.gunner.enablePain = 1
  96.     }
  97.  
  98. end
  99.  
  100. //****************************************************
  101. //****************************************************
  102. halftrack_killed local.halftrack:
  103.     local.halftrack waitthread halftrack_killer
  104. end
  105.  
  106. halftrack_killer:
  107. //    self.collisionent disconnect_paths
  108.     self show
  109.     self playsound explode_tank
  110.     self stop
  111.     if (self.mg42binderthread != NIL && self.mg42binderthread != NULL)
  112.         self.mg42binderthread delete
  113.  
  114.     if (self.gunnerlogicthread != NIL && self.gunnerlogicthread != NULL)
  115.         self.gunnerlogicthread delete
  116.     
  117.     if (self.center != NIL && self.center != NULL)
  118.         self.center remove
  119.  
  120.     if (self.mg42)
  121.     {
  122.         self DetachTurretSlot 0
  123.         self.mg42 stopfiring
  124.         self.mg42 remove
  125.     }
  126.     if ($(self.gunner))
  127.     {
  128.         self DetachPassengerSlot 1 self.gunner.origin
  129.         self.gunner remove
  130.         //self.gunner bedead
  131.         //self.gunner hide
  132.         //self.gunner notsolid
  133.     }
  134.     
  135.     exec global/earthquake.scr .2 4 0 0
  136.     radiusdamage self.origin 200 200
  137.     self thread spawn_fx models/fx/fx_tank_explosion.tik
  138.  
  139.     local.name = self
  140.     local.angles = self.angles
  141.     local.origin = self.origin
  142.     local.brushmodel = self.collisionent.brushmodel
  143.     self hide
  144.     self notsolid
  145.  
  146.     //local.collision = thread damaged_collision local.angles local.origin local.brushmodel
  147.     local.collision = spawn script_object model local.brushmodel
  148.     local.collision.origin = local.origin
  149.     local.collision.angles = local.angles
  150.     local.collision disconnect_paths
  151.     
  152.     local.damaged = spawn script_model model self.destroyedmodel
  153.     local.damaged.origin = local.origin
  154.     local.damaged.angles = local.angles
  155.     local.damaged notsolid
  156.     
  157.     wait .5
  158.     if (self)
  159.         self remove
  160. end
  161.  
  162.  
  163. //****************************************************
  164. //****************************************************
  165. halftrackmg42bind:
  166.     //this should be moved in code...
  167.     while (1)
  168.     {
  169.         local.a = self.angles
  170.         self.mg42 yawCenter local.a[1]
  171.         waitframe
  172.     }
  173. end
  174.  
  175. //****************************************************
  176. //****************************************************
  177. halftrackgunnerlogic:
  178.     self.firemg = 0
  179.     local.firestate = 0
  180.     local.starttime = 0.0
  181.     local.endtime = 0.0
  182.     local.fireduration = 1.5
  183.     local.firedelay = 2.5
  184.  
  185.     while ((isAlive $(self.gunner)) && (isAlive self))
  186.     {
  187.         local.besttarget = self.gunner findenemy
  188.         if (local.besttarget != NULL)
  189.         {
  190.             local.vec = local.besttarget.origin - self.gunner.origin
  191.             local.yawtarget = self GetLocalYawFromVector local.vec
  192.             local.yawdir = self GetLocalYawFromVector self.forwardvector
  193.             local.diff = abs(local.yawdir) - abs(local.yawtarget)
  194.             local.diff = abs(local.diff)
  195.             //println ("***DIFF: " + local.diff + " Yawtarget: " + local.yawtarget + " Yawdir: " + local.yawdir)
  196.             if (local.diff > 60 && self.passengers == 0)
  197.             {
  198.                 if (self.gunner.type_idle != self.gunner.default_idle)
  199.                 {
  200.                     self.gunner type_idle self.gunner.default_idle
  201.                     self.gunner type_attack "cover"
  202.                     self.gunner type_disguise self.gunner.default_disguise
  203.                     self.gunner type_grenade self.gunner.default_grenade
  204.                     self.gunner turret NULL
  205.                     self.gunner.enableEnemy = 1
  206.                     self.gunner takedamage
  207.                     self.gunner.enablePain = 1
  208.                 }
  209.                 self.mg42 setaimtarget self.center
  210.                 self.firemg = 0
  211.             }
  212.             else
  213.             {
  214.                 if (self.gunner.type_idle != "machinegunner")
  215.                 {
  216.                     self.gunner type_idle machinegunner
  217.                     self.gunner type_attack machinegunner
  218.                     self.gunner type_disguise machinegunner
  219.                     self.gunner type_grenade machinegunner
  220.                     self.gunner turret self.mg42
  221.                     self.gunner.enableEnemy = 0
  222.                     self.gunner takedamage
  223.                     self.gunner.enablePain = 1
  224.                 }
  225.                 if (self.gunner cansee local.besttarget 80 1525)
  226.                 {
  227.                     self.mg42 setaimtarget local.besttarget
  228.                     self.firemg = 1
  229.                 }
  230.                 else
  231.                 {
  232.                     self.mg42 setaimtarget self.center
  233.                     self.firemg = 0
  234.                 }
  235.             }
  236.         }
  237.         else
  238.         {
  239.             self.mg42 setaimtarget self.center
  240.             self.firemg = 0
  241.         }
  242.  
  243.         if (self.firemg == 1)
  244.         {
  245.             switch (local.firestate)
  246.             {
  247.                 //start fire
  248.                 case 0:
  249.                     self.mg42 startfiring
  250.                     local.starttime = level.time
  251.                     local.endtime = level.time + local.fireduration
  252.                     local.firestate = 1
  253.                     break
  254.                 //fire duration
  255.                 case 1:
  256.                     if (level.time > local.endtime)
  257.                     {
  258.                         local.firestate = 2
  259.                     }
  260.                     break
  261.                 case 2:
  262.                     self.mg42 stopfiring
  263.                     local.starttime = level.time
  264.                     local.endtime = level.time + local.firedelay
  265.                     local.firestate = 3
  266.                     break
  267.                 case 3:
  268.                     if (level.time > local.endtime)
  269.                     {
  270.                         local.firestate = 0
  271.                     }
  272.                     break
  273.             }
  274.         }
  275.         else
  276.         {
  277.             self.mg42 stopfiring
  278.         }
  279.  
  280.         wait 0.10
  281.     }
  282.     
  283.     self.mg42 stopfiring
  284.     self.mg42 setaimtarget self.center
  285.     self.firemg = 0
  286.  
  287. end
  288.  
  289. //****************************************************
  290. //****************************************************
  291. halftrack_loadpassengers local.halftrack local.numpassengers local.panzerflag local.type1 local.type2:
  292.     
  293.     local.startslot = 1
  294.     
  295.     if (local.halftrack.gunner)
  296.     {
  297.         //we have gunner... we can only have 2 passengers
  298.         if (local.numpassengers > 2)
  299.         {
  300.             local.numpassengers = 2
  301.         }
  302.         local.startslot = 2
  303.     }
  304.     else
  305.     {
  306.         if (local.numpassengers > 3)
  307.             local.numpassengers = 3
  308.     }
  309.  
  310.     local.endslot = local.startslot + local.numpassengers
  311.  
  312.     if (local.type1 == NIL && local.type2 == NIL)
  313.     {
  314.         local.guy_type = human/german_winter_type1
  315.     }
  316.     else
  317.     if (local.type1 != NIL && local.type2 == NIL)
  318.     {
  319.         local.guy_type = local.type1
  320.     }
  321.  
  322.     local.halftrack.passengers = local.numpassengers
  323.  
  324.     for (local.slot = local.startslot; local.slot < local.endslot; local.slot++)
  325.     {
  326.         if (local.type1 != NIL && local.type2 != NIL)
  327.         {
  328.             local.temp = randomint 2
  329.  
  330.             if (local.temp == 0)
  331.                 local.guy_type = local.type1
  332.             else
  333.                 local.guy_type = local.type2
  334.         }
  335.         
  336.         if ( (local.panzerflag == "1") && (local.slot == 1) )
  337.             local.gun = "panzerschrek"
  338.         else if (randomint 3 == 1) 
  339.             local.gun = "MP40"
  340.         else
  341.             local.gun = "Mauser KAR 98K"
  342.         
  343.         //println ("****spawning passenger type: " + local.guy_type)
  344.         local.guy = spawn local.guy_type "gun" local.gun
  345.         if (local.guy != NIL && local.guy != NULL)
  346.         {
  347.             local.guy.origin = local.halftrack.origin
  348.             local.guy rendereffects "-shadow"
  349.             local.guy dontdropweapons
  350.             //if (level.dontdropweapons == 1)
  351.             //    local.guy dontdropweapons
  352.             local.halftrack AttachPassengerSlot local.slot local.guy
  353.             local.guy type_attack "cover"
  354.             local.guy leash 0
  355.             local.guy fixedleash 1
  356.             local.guy physics_off
  357.             //local.guy removeondeath 1
  358.             local.guy thread halftrackpassenger_deaththread local.halftrack
  359.  
  360.             switch (local.slot)
  361.             {
  362.             case 1:
  363.                 local.guy exec global/setdeathanim.scr "death_headpistol"
  364.                 break
  365.             case 2:
  366.                 local.guy exec global/setdeathanim.scr "death_crotch"
  367.                 break
  368.             case 3:
  369.                 local.guy exec global/setdeathanim.scr "death_left"
  370.                 break
  371.             case 4:
  372.                 local.guy exec global/setdeathanim.scr "death_run"
  373.                 break
  374.             case 5:
  375.                 local.guy exec global/setdeathanim.scr "death_shoot"
  376.                 break
  377.             case 6:
  378.                 local.guy exec global/setdeathanim.scr "death_right"
  379.                 break
  380.             default:
  381.                 local.guy exec global/setdeathanim.scr "death_collapse"
  382.                 break
  383.             }
  384.         }
  385.         else
  386.         {
  387.             println ("***Halftrack " + local.halftrack + " could not create passenger")
  388.             local.halftrack.passengers = local.halftrack.passengers - 1
  389.         }
  390.     }
  391. end
  392. //****************************************************
  393. //****************************************************
  394. halftrackpassenger_deaththread local.halftrack:
  395.     self waittill death
  396.     if (local.halftrack == NULL)
  397.         end
  398.     if (local.halftrack.passengers > 0)
  399.         local.halftrack.passengers = local.halftrack.passengers - 1
  400.  
  401. end
  402.  
  403. //****************************************************
  404. //****************************************************
  405. halftrack_passengerunload local.halftrack local.unloadgunner:
  406.     local.startslot = 1
  407.     if (local.unloadgunner == NIL)
  408.         local.unloadgunner = 0
  409.     
  410.     if (local.halftrack.gunner && local.unloadgunner == 0)
  411.     {
  412.         local.numpassengers = 2
  413.         local.startslot = 2
  414.     }
  415.     else
  416.     {
  417.         local.numpassengers = 3
  418.     }
  419.  
  420.     local.endslot = local.startslot + local.numpassengers
  421.  
  422.     for (local.slot = local.startslot; local.slot < local.endslot; local.slot++)
  423.         local.halftrack thread halftrack_passenger_unloader local.slot
  424.  
  425. end
  426.  
  427. //****************************************************
  428. //****************************************************
  429. halftrack_passenger_unloader local.slot:
  430.     local.ent = self QueryPassengerSlotEntity local.slot
  431.     
  432.     if !(isAlive local.ent)
  433.         end
  434.     
  435.     if (local.ent == NULL)
  436.         end
  437.     
  438.     local.ent exec global/disable_ai.scr
  439.     self DetachPassengerSlot local.slot local.ent.origin
  440.     local.tag = ("passenger" + local.slot)
  441.     //println "z:      local.tag: " local.tag
  442.     if (local.slot == 1)
  443.     {
  444.         println "*********Unloading Gunner..."
  445.         if (self.gunnerlogicthread != NIL && self.gunnerlogicthread != NULL)
  446.         {
  447.             self.gunnerlogicthread delete
  448.             self.gunnerlogicthread = NULL
  449.         }
  450.         self.gunner type_idle self.gunner.default_idle
  451.         self.gunner type_attack self.gunner.default_attack
  452.         self.gunner type_disguise self.gunner.default_disguise
  453.         self.gunner type_grenade self.gunner.default_grenade
  454.     }
  455.  
  456.     local.ent.origin = self gettagposition local.tag
  457.     local.ent.angles = self gettagangles local.tag
  458.     local.ent notsolid
  459.     local.ent physics_on
  460.     local.bailoutdelay = (randomfloat 0.5) + 0.1
  461.     wait local.bailoutdelay
  462.     local.ent anim_noclip 21G700_Jumpout
  463.     local.ent waittill animdone
  464.     local.ent solid
  465.     local.ent rendereffects "+shadow"
  466.     local.ent leash 10000
  467.     local.ent exec global/setdeathanim.scr NIL
  468.     local.ent.enableEnemy = 1
  469.     //local.ent exec global/enable_ai.scr
  470.     if (self == NULL)
  471.         end
  472.     if (self.passengers > 0)
  473.         self.passengers = self.passengers - 1
  474. end
  475.  
  476. //****************************************************
  477. //****************************************************
  478. halftrack_drive local.halftrack local.pathname local.unloadpassengers local.speed local.acc local.nodedist local.lookahead:
  479.  
  480.     //drive parameters: ideal speed, acceleration/deceleration, close to nodes, lookahead 200 80 40 128
  481.     local.halftrack drive $(local.pathname) local.speed local.acc local.nodedist local.lookahead
  482.     
  483.     //self modifydrive 80 50 256            //bump down the speed a bit    60 50 256 (original)
  484.     
  485.     local.halftrack waittill drive
  486.     
  487.     //iprintln "DRIVING DONE"
  488.     
  489.     if (local.unloadpassengers)
  490.         waitthread halftrack_passengerunload local.halftrack 0
  491.     
  492.     local.halftrack disconnect_paths
  493. end
  494.  
  495. spawn_fx local.fx:
  496.     local.temp = spawn script_model model local.fx
  497.     local.temp notsolid
  498.     local.temp.origin = self.origin
  499.     local.temp anim start
  500.     local.temp notsolid
  501.     wait 5
  502.     local.temp remove
  503. end
  504.